home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / tcdev.arc / MONO.C < prev    next >
C/C++ Source or Header  |  1987-07-14  |  3KB  |  130 lines

  1. /* 78,63 */
  2. /* 07-14-87 00:06:06 clear the 25th line after scrolling. */
  3. /* 07-13-87 23:58:36 handle output status. */
  4. /* 07-13-87 23:53:31 position the cursor after writing. */
  5. /* 07-13-87 23:44:11 store the correct attributes. */
  6. #include <dos.h>
  7. #include <string.h>
  8. #include <mem.h>
  9.  
  10. struct srh {
  11.     char len;
  12.     char unit;
  13.     char cmd;
  14.     int status;
  15.     char res[8];
  16.     union {
  17.         struct { /* init */
  18.             char units;
  19.             char far *kaddr;
  20.             char far *baddr;
  21.         } cin;
  22.         struct { /* media check */
  23.             char media, stat;
  24.         } cmc;
  25.         struct { /* build parameter block. */
  26.             char media;
  27.             char far *taddr;
  28.             char far *baddr;
  29.         } cbpb;
  30.         struct { /* reading and writing */
  31.             char media;
  32.             char far *taddr;
  33.             unsigned count;
  34.             unsigned start;
  35.         } crw;
  36.         struct { /* nondestructive read no wait */
  37.             char ch;
  38.         } cic;
  39.     } c;
  40. };
  41. extern char dev_name[9];
  42. extern int dev_attr;
  43.  
  44.  
  45. #define WHITE 0x700
  46. int    row = 0, col = 0;
  47.  
  48. device_driver(struct srh far *request)
  49. {
  50.     char far *tptr;  /* pointer to the string of chars */
  51.     int far *sptr;   /* pointer to the screen */
  52.     unsigned count;
  53.     extern char enddata;
  54.  
  55.     switch(request->cmd) {
  56.     case  0: /* initialize */
  57.         strcpy(&dev_name, "MON     ");
  58.         dev_attr = 0x8000;
  59.         request->c.cin.kaddr = (char far *) &enddata;
  60.         request->status = 0x0100;  /* ready */
  61.         break;
  62.     case  8: /* output */
  63.     case  9: /* output with verify */
  64.         tptr = request->c.crw.taddr;
  65.         sptr = (int far *) MK_FP(0xb000, (row*80 + col) <<1);
  66.         count = request->c.crw.count;
  67.         while (count--) switch(*tptr) {
  68.             case 13:
  69.                 col = 0;
  70.                 sptr = (int far *) MK_FP(0xb000, (row*80 + col) <<1);
  71.                 break;
  72.             case 10:
  73.                 if (++row > 24) {
  74.                     --row;
  75.                     movedata(0xb000, 160, 0xb000, 0, 24*80*2);
  76.                     sptr = (int far *) MK_FP(0xb000, (row*80 + col) <<1);
  77.                     {    /* clear the bottom line. */
  78.                         int count = 80;
  79.  
  80.                         while (count--) *sptr++ = WHITE | ' ';
  81.                     }
  82.                 }
  83.                 sptr = (int far *) MK_FP(0xb000, (row*80 + col) <<1);
  84.                 break;
  85.             case 8:
  86.                 if (col) {
  87.                     col--;
  88.                     sptr--;
  89.                     }
  90.                 break;
  91.             case 9:
  92.                 if (col >= 80) break;
  93.                 while (++col & 7) *sptr++ = WHITE | ' ';
  94.                 break;
  95.             default:
  96.                 if (col++ >= 80) break;
  97.                 *sptr++ = WHITE | *tptr++;
  98.                 break;
  99.         }
  100.         {
  101.             int cursor_pos = FP_OFF(sptr) >> 1;
  102.             disable();
  103.             outportb(0x3b4, 14);
  104.             outportb(0x3b5, cursor_pos >> 8);
  105.             outportb(0x3b4, 15);
  106.             outportb(0x3b5, cursor_pos & 0xff);
  107.             enable();
  108.         }
  109.         request->status = 0x0100;  /* ready */
  110.         break;
  111.  
  112.     case 10: /* output status */
  113.     case 11: /* output buffer flush */
  114.         request->status = 0x0100;  /* ready */
  115.         break;
  116.     /* these are cases that we don't handle ourselves */
  117.     case  1: /* media check */
  118.     case  2: /* build bpb */
  119.     case  3: /* input ioctl */
  120.     case  4: /* input */
  121.     case  5: /* input check (buffer status) */
  122.     case  6: /* input status */
  123.     case  7: /* input flush */
  124.     case 12: /* output ioctl */
  125.     default:
  126.         request->status = 0x8003;  /* unknown command */
  127.         break;
  128.     }
  129. }
  130.